/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import control.ControladorAlternativa;
import control.ControladorCriterio;
import control.ControladorMatriz;
import helper.AlternativaHelper;
import helper.CriterioHelper;
import helper.MatrizHelper;
import helper.ProblemaHelper;
import java.awt.Desktop;
import java.awt.Rectangle;
import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import model.Alternativa;
import model.Criterio;
import model.Matriz;
import model.Problema;
import util.Calculos;

/**
 *
 * @author jorge
 */
public final class MainPanel extends javax.swing.JFrame {

    /**
     * Creates new form MainPanel
     */
    AlternativaPanel alternativaPanel;
    CriterioPanel criterioPanel;
    PanelDefecto panelDefecto;
    MatrizInicialPanel matrizInicialPanel;
    ControladorAlternativa controladorAlternativas;
    ControladorCriterio controladorCriterios;
    ControladorMatriz controladorMatriz;
    javax.swing.tree.DefaultMutableTreeNode nodoProblema;
    javax.swing.tree.DefaultMutableTreeNode nodoAlternativas;
    javax.swing.tree.DefaultMutableTreeNode nodoCriterios;
    int alternativaSeleccionada;
    int criterioSeleccionado;
    String panelSeleccionado;
    public static final String PANEL_ALTERNATIVA = "alternativa";
    public static final String PANEL_CRITERIO = "criterio";
    public static final int CANTIDAD_ENTIDADES = 4;
    boolean nodoInicializado;
    Matriz matriz;
    String[][] matrizRespaldo;

    public MainPanel() {
        initComponents();

        nuevoBoton1.setContentAreaFilled(false);
        abrirBoton.setContentAreaFilled(false);
        guardarBoton.setContentAreaFilled(false);
        anadirAlternativaBoton.setContentAreaFilled(false);
        anadirCriterioBoton.setContentAreaFilled(false);
        empezarBoton.setContentAreaFilled(false);

        guardarMatrizBoton.setEnabled(false);

        //TODO inicializar otras variables
        panelDefecto = new PanelDefecto();
        cargarPanelDefecto();

        controladorAlternativas = new ControladorAlternativa();
        controladorCriterios = new ControladorCriterio();
        controladorMatriz = new ControladorMatriz();

        alternativaSeleccionada = -1;
        criterioSeleccionado = -1;

        panelSeleccionado = "";
        nodoInicializado = false;

        matriz = new Matriz();

        //Fin inicializar todos los paneles

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        herramientasPanel = new javax.swing.JPanel();
        guardarBoton = new javax.swing.JButton();
        abrirBoton = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        anadirAlternativaBoton = new javax.swing.JButton();
        anadirCriterioBoton = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JSeparator();
        empezarBoton = new javax.swing.JButton();
        nuevoBoton1 = new javax.swing.JButton();
        pressBoton = new javax.swing.JButton();
        arbolPanel = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        problemaTree = new javax.swing.JTree();
        principalPanel = new javax.swing.JPanel();
        panelBotones = new javax.swing.JPanel();
        guardarSeleccionBoton = new javax.swing.JButton();
        eliminarSeleccionBoton = new javax.swing.JButton();
        guardarMatrizBoton = new javax.swing.JButton();
        menuBar = new javax.swing.JMenuBar();
        archivoMenu = new javax.swing.JMenu();
        nuevoMenuItem = new javax.swing.JMenuItem();
        abrirMenuItem = new javax.swing.JMenuItem();
        guardarMenuItem = new javax.swing.JMenuItem();
        guardarComoMenuItem = new javax.swing.JMenuItem();
        salirMenuItem = new javax.swing.JMenuItem();
        editarMenu = new javax.swing.JMenu();
        opcionesMenu = new javax.swing.JMenu();
        herramientasMenu = new javax.swing.JMenu();
        añadirAlternativaMenuItem = new javax.swing.JMenuItem();
        añadirCriterioMenuItem = new javax.swing.JMenuItem();
        ayudaMenu = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);

        herramientasPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        guardarBoton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/15.png"))); // NOI18N
        guardarBoton.setToolTipText("Guardar");
        guardarBoton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        guardarBoton.setBorderPainted(false);
        guardarBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarBotonActionPerformed(evt);
            }
        });

        abrirBoton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/17.png"))); // NOI18N
        abrirBoton.setToolTipText("Abrir");
        abrirBoton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        abrirBoton.setBorderPainted(false);
        abrirBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                abrirBotonActionPerformed(evt);
            }
        });

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);

        anadirAlternativaBoton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/8.png"))); // NOI18N
        anadirAlternativaBoton.setToolTipText("Añadir Alternativa");
        anadirAlternativaBoton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        anadirAlternativaBoton.setBorderPainted(false);
        anadirAlternativaBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                anadirAlternativaBotonActionPerformed(evt);
            }
        });

        anadirCriterioBoton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/9.png"))); // NOI18N
        anadirCriterioBoton.setToolTipText("Añadir Criterio");
        anadirCriterioBoton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        anadirCriterioBoton.setBorderPainted(false);
        anadirCriterioBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                anadirCriterioBotonActionPerformed(evt);
            }
        });

        jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);

        empezarBoton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/6.png"))); // NOI18N
        empezarBoton.setToolTipText("Empezar");
        empezarBoton.setBorder(null);
        empezarBoton.setBorderPainted(false);
        empezarBoton.setFocusPainted(false);
        empezarBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                empezarBotonActionPerformed(evt);
            }
        });

        nuevoBoton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/view/icons/14.png"))); // NOI18N
        nuevoBoton1.setToolTipText("Nuevo");
        nuevoBoton1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        nuevoBoton1.setBorderPainted(false);
        nuevoBoton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nuevoBoton1ActionPerformed(evt);
            }
        });

        pressBoton.setFont(new java.awt.Font("Comic Sans MS", 2, 12)); // NOI18N
        pressBoton.setForeground(new java.awt.Color(51, 102, 255));
        pressBoton.setText("Press");
        pressBoton.setEnabled(false);
        pressBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pressBotonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout herramientasPanelLayout = new javax.swing.GroupLayout(herramientasPanel);
        herramientasPanel.setLayout(herramientasPanelLayout);
        herramientasPanelLayout.setHorizontalGroup(
            herramientasPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(herramientasPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(nuevoBoton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(abrirBoton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(guardarBoton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(12, 12, 12)
                .addComponent(anadirAlternativaBoton)
                .addGap(18, 18, 18)
                .addComponent(anadirCriterioBoton)
                .addGap(4, 4, 4)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(empezarBoton)
                .addGap(18, 18, 18)
                .addComponent(pressBoton, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        herramientasPanelLayout.setVerticalGroup(
            herramientasPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, herramientasPanelLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(pressBoton))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, herramientasPanelLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(empezarBoton, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(herramientasPanelLayout.createSequentialGroup()
                .addGroup(herramientasPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1, Short.MAX_VALUE)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING))
                .addGap(0, 0, Short.MAX_VALUE))
            .addGroup(herramientasPanelLayout.createSequentialGroup()
                .addGroup(herramientasPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(guardarBoton)
                    .addComponent(abrirBoton)
                    .addComponent(nuevoBoton1)
                    .addComponent(anadirCriterioBoton)
                    .addComponent(anadirAlternativaBoton))
                .addGap(0, 0, Short.MAX_VALUE))
        );

        arbolPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Arbol"));

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Problema");
        problemaTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        problemaTree.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        problemaTree.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                problemaTreeMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(problemaTree);

        javax.swing.GroupLayout arbolPanelLayout = new javax.swing.GroupLayout(arbolPanel);
        arbolPanel.setLayout(arbolPanelLayout);
        arbolPanelLayout.setHorizontalGroup(
            arbolPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(arbolPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        arbolPanelLayout.setVerticalGroup(
            arbolPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(arbolPanelLayout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
                .addContainerGap())
        );

        principalPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Panel Principal"));

        javax.swing.GroupLayout principalPanelLayout = new javax.swing.GroupLayout(principalPanel);
        principalPanel.setLayout(principalPanelLayout);
        principalPanelLayout.setHorizontalGroup(
            principalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        principalPanelLayout.setVerticalGroup(
            principalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        panelBotones.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        guardarSeleccionBoton.setText("Guardar Seleccion");
        guardarSeleccionBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarSeleccionBotonActionPerformed(evt);
            }
        });

        eliminarSeleccionBoton.setText("Eliminar Seleccion");
        eliminarSeleccionBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarSeleccionBotonActionPerformed(evt);
            }
        });

        guardarMatrizBoton.setText("Válidar Matriz");
        guardarMatrizBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarMatrizBotonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelBotonesLayout = new javax.swing.GroupLayout(panelBotones);
        panelBotones.setLayout(panelBotonesLayout);
        panelBotonesLayout.setHorizontalGroup(
            panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBotonesLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(guardarSeleccionBoton)
                .addGap(18, 18, 18)
                .addComponent(eliminarSeleccionBoton, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(guardarMatrizBoton, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(547, Short.MAX_VALUE))
        );
        panelBotonesLayout.setVerticalGroup(
            panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(guardarSeleccionBoton)
                .addComponent(eliminarSeleccionBoton)
                .addComponent(guardarMatrizBoton))
        );

        archivoMenu.setText("Archivo");

        nuevoMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        nuevoMenuItem.setText("Nuevo");
        nuevoMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nuevoMenuItemActionPerformed(evt);
            }
        });
        archivoMenu.add(nuevoMenuItem);

        abrirMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
        abrirMenuItem.setText("Abrir");
        abrirMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                abrirMenuItemActionPerformed(evt);
            }
        });
        archivoMenu.add(abrirMenuItem);

        guardarMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        guardarMenuItem.setText("Guardar");
        guardarMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarMenuItemActionPerformed(evt);
            }
        });
        archivoMenu.add(guardarMenuItem);

        guardarComoMenuItem.setText("Guardar Como");
        guardarComoMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guardarComoMenuItemActionPerformed(evt);
            }
        });
        archivoMenu.add(guardarComoMenuItem);

        salirMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK));
        salirMenuItem.setText("Salir");
        salirMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                salirMenuItemActionPerformed(evt);
            }
        });
        archivoMenu.add(salirMenuItem);

        menuBar.add(archivoMenu);

        editarMenu.setText("Editar");
        menuBar.add(editarMenu);

        opcionesMenu.setText("Opciones");
        menuBar.add(opcionesMenu);

        herramientasMenu.setText("Herramientas");

        añadirAlternativaMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        añadirAlternativaMenuItem.setText("Añadir Alternativa");
        añadirAlternativaMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                añadirAlternativaMenuItemActionPerformed(evt);
            }
        });
        herramientasMenu.add(añadirAlternativaMenuItem);

        añadirCriterioMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        añadirCriterioMenuItem.setText("Añadir Criterio");
        añadirCriterioMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                añadirCriterioMenuItemActionPerformed(evt);
            }
        });
        herramientasMenu.add(añadirCriterioMenuItem);

        menuBar.add(herramientasMenu);

        ayudaMenu.setText("Ayuda");
        menuBar.add(ayudaMenu);

        setJMenuBar(menuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(herramientasPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(arbolPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(principalPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(panelBotones, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(herramientasPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(principalPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelBotones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(arbolPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(37, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void nuevoMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nuevoMenuItemActionPerformed
        nuevoProblema();
    }//GEN-LAST:event_nuevoMenuItemActionPerformed

    private void abrirMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_abrirMenuItemActionPerformed
        abrirArchivo();
    }//GEN-LAST:event_abrirMenuItemActionPerformed

    private void añadirAlternativaMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_añadirAlternativaMenuItemActionPerformed
        añadirAlternativa();
    }//GEN-LAST:event_añadirAlternativaMenuItemActionPerformed

    private void empezarBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_empezarBotonActionPerformed
        if (nodoInicializado) {
            cargarMatrizInicialPanel();
            guardarMatrizBoton.setEnabled(true);
        } else {
            JOptionPane.showMessageDialog(this, "Debe crear un nuevo problema antes de solicitar la matriz", "Oops! Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_empezarBotonActionPerformed

    private void problemaTreeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_problemaTreeMouseClicked
//        if (evt.getClickCount() == 2) {
        TreePath currentSelection = problemaTree.getSelectionPath();

        if (currentSelection != null) {
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());

            MutableTreeNode parent = (MutableTreeNode) (currentNode.getParent());
            if (parent != null) {

                int filaSeleccionada = problemaTree.getSelectionRows()[0];
                int indiceAlternativas = nodoAlternativas.getChildCount() + 2;

                if (filaSeleccionada >= 2 && filaSeleccionada < indiceAlternativas) { //Se trata de un objeto alternativa
                    Alternativa alternativa = (Alternativa) currentNode.getUserObject();

                    cargarAlternativaPanel(alternativa);
                    alternativaSeleccionada = filaSeleccionada - 2;
                    panelSeleccionado = PANEL_ALTERNATIVA;

                } else if (filaSeleccionada > indiceAlternativas && filaSeleccionada <= indiceAlternativas + nodoCriterios.getChildCount()) { //Se trata de un objeto criterio
                    Criterio criterio = (Criterio) currentNode.getUserObject();
                    try {
                        cargarCriterioPanel(criterio);
                    } catch (IOException ex) {
                        Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    criterioSeleccionado = filaSeleccionada - nodoAlternativas.getChildCount() - 3;

                    panelSeleccionado = PANEL_CRITERIO;
                }
            }
        }

//        }
    }//GEN-LAST:event_problemaTreeMouseClicked

    private void guardarSeleccionBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarSeleccionBotonActionPerformed

        if (!panelSeleccionado.equals("")) {
            if (panelSeleccionado.equals(PANEL_ALTERNATIVA)) {
                Alternativa alternativaActualizada = controladorAlternativas.actualizarAlternativa(alternativaPanel.getNombre(), alternativaPanel.getDescripcion());

                if (alternativaActualizada != null && alternativaSeleccionada != -1) {
                    nodoAlternativas.remove(alternativaSeleccionada);
                    recargarAlternativa(alternativaActualizada, alternativaSeleccionada);
                } else {
//                    Mensaje advirtiendo que no se puede guardar
                }
            } else if (panelSeleccionado.equals(PANEL_CRITERIO)) {
                Criterio criterioActualizado = controladorCriterios.actualizarCriterio(criterioPanel.getNombre(), criterioPanel.getDescripcion(), criterioPanel.getEscala(), criterioPanel.getCualitativoCuantitativo(), criterioPanel.getOptimizacion(), criterioPanel.getUnidades());

                if (criterioActualizado != null && criterioSeleccionado != -1) {
                    nodoCriterios.remove(criterioSeleccionado);
                    try {
                        recargarCriterio(criterioActualizado, criterioSeleccionado);
                    } catch (IOException ex) {
                        Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
//                    Mensaje advirtiendo que no se puede guardar
                }
            }
        }


    }//GEN-LAST:event_guardarSeleccionBotonActionPerformed

    private void eliminarSeleccionBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarSeleccionBotonActionPerformed
        TreePath currentSelection = problemaTree.getSelectionPath();

        if (currentSelection != null) {
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());

            MutableTreeNode parent = (MutableTreeNode) (currentNode.getParent());
            if (parent != null) {

                int filaSeleccionada = problemaTree.getSelectionRows()[0];
                int indiceAlternativas = nodoAlternativas.getChildCount() + 2;

                if (filaSeleccionada >= 2 && filaSeleccionada < indiceAlternativas) { //Se trata de un objeto alternativa
                    alternativaSeleccionada = filaSeleccionada - 2;
                    nodoAlternativas.remove(alternativaSeleccionada);
                } else if (filaSeleccionada > indiceAlternativas && filaSeleccionada <= indiceAlternativas + nodoCriterios.getChildCount()) { //Se trata de un objeto criterio
                    criterioSeleccionado = filaSeleccionada - nodoAlternativas.getChildCount() - 3;
                    nodoCriterios.remove(criterioSeleccionado);
                }

                actualizarArbol();
            }
        }
    }//GEN-LAST:event_eliminarSeleccionBotonActionPerformed

    private void añadirCriterioMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_añadirCriterioMenuItemActionPerformed
        try {
            añadirCriterio();
        } catch (IOException ex) {
            Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_añadirCriterioMenuItemActionPerformed

    private void abrirBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_abrirBotonActionPerformed
        abrirArchivo();

    }//GEN-LAST:event_abrirBotonActionPerformed

    private void guardarBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarBotonActionPerformed
        guardarArchivo();
    }//GEN-LAST:event_guardarBotonActionPerformed

    private void nuevoBoton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nuevoBoton1ActionPerformed
        nuevoProblema();
    }//GEN-LAST:event_nuevoBoton1ActionPerformed

    private void anadirAlternativaBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_anadirAlternativaBotonActionPerformed
        añadirAlternativa();
    }//GEN-LAST:event_anadirAlternativaBotonActionPerformed

    private void anadirCriterioBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_anadirCriterioBotonActionPerformed
        try {
            añadirCriterio();
        } catch (IOException ex) {
            Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_anadirCriterioBotonActionPerformed

    private void guardarMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarMenuItemActionPerformed
        guardarArchivo();
    }//GEN-LAST:event_guardarMenuItemActionPerformed

    private void guardarComoMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarComoMenuItemActionPerformed
        guardarArchivo();
    }//GEN-LAST:event_guardarComoMenuItemActionPerformed

    private void salirMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_salirMenuItemActionPerformed
        System.exit(0);
    }//GEN-LAST:event_salirMenuItemActionPerformed

    private void guardarMatrizBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guardarMatrizBotonActionPerformed
        String[][] matrizTemporal = matrizInicialPanel.getMatriz();
        matriz.setMatriz(matrizTemporal);

        String validarMatriz = controladorMatriz.validarGuardadoMatriz(matriz);

        if (validarMatriz.equals(controladorMatriz.RESPUESTA_OK)) {
            JOptionPane.showMessageDialog(null, "Guardado exitoso!", "Guardado exitoso!", JOptionPane.INFORMATION_MESSAGE);
            matrizInicialPanel.habilitarOptimosPareto(true);
            guardarMatrizBoton.setEnabled(false);
            matrizInicialPanel.cargarTablaLabels(matrizTemporal);
            matrizRespaldo = matrizTemporal.clone();

        } else {
            JOptionPane.showMessageDialog(null, "Guardado exitoso! pero con errores de datos\n" + validarMatriz, "Guardado exitoso!", JOptionPane.ERROR_MESSAGE);
            matrizInicialPanel.habilitarOptimosPareto(false);
            guardarMatrizBoton.setEnabled(true);
        }
    }//GEN-LAST:event_guardarMatrizBotonActionPerformed

    private void pressBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pressBotonActionPerformed
        String[][] resultados = Calculos.pressPaso4();
        ArrayList<Alternativa> alternativas = Calculos.getAlternativas();
        String resultado = "";

        String si = "Si";
        String no = "No";
        
        Object[] options = {no, si};
        
        int indice = 0;
        String valorIndice = "-1000";
        
        resultado+=completarCaracteres("Alternativas", 30, " ")+""+completarCaracteres("Di", 15, " ")+""+completarCaracteres("di", 15, " ")+""+completarCaracteres("li", 15, " ")+"\n\n";
        for (int i = 0; i < resultados.length; i++){
            String nombre = alternativas.get(i).getNombre();
            resultado+= nombre.length() > 25 ? completarCaracteres(nombre.substring(0, 25)+"...", 30, path) : completarCaracteres(nombre, 30, " ")+"";
            resultado+=completarCaracteres(Calculos.df.format(Double.parseDouble(resultados[i][0])), 15, " ")+"";
            resultado+=completarCaracteres(Calculos.df.format(Double.parseDouble(resultados[i][1])), 15, " ")+"";
            resultado+=completarCaracteres(Calculos.df.format(Double.parseDouble(resultados[i][2])), 15, " ")+""+"\n"+"\n";
            if (Double.parseDouble(resultados[i][2])>Double.parseDouble(valorIndice)){
                valorIndice = resultados[i][2];
                indice = i;
            }
        }

        resultado+="La alternativa más adecuada según el método de Press es "+alternativas.get(indice).getNombre()+"\n"+"\n";
        resultado += "Desea ver el informe?";
        
        int opcion = JOptionPane.showOptionDialog(this, resultado, "¡Respuesta Press!", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, si);
        
        if (opcion == 1) { //Se ha seleccionado ver el informe
            AbrirInforme(Calculos.NOMBRE_INFORME_PRESS);
        }
        matrizInicialPanel.habilitarPanelCriterioMinimizar(false);
    }//GEN-LAST:event_pressBotonActionPerformed

    public String completarCaracteres(String original, int cantidad, String caracter) {
        String respuesta = original;
        for (int i = original.length(); i <= cantidad; i++) {
            respuesta += caracter;
        }
        return respuesta;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MainPanel().setVisible(true);
            }
            DecimalFormat df = new DecimalFormat("#.###");
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton abrirBoton;
    private javax.swing.JMenuItem abrirMenuItem;
    private javax.swing.JButton anadirAlternativaBoton;
    private javax.swing.JButton anadirCriterioBoton;
    private javax.swing.JPanel arbolPanel;
    private javax.swing.JMenu archivoMenu;
    private javax.swing.JMenu ayudaMenu;
    private javax.swing.JMenuItem añadirAlternativaMenuItem;
    private javax.swing.JMenuItem añadirCriterioMenuItem;
    private javax.swing.JMenu editarMenu;
    private javax.swing.JButton eliminarSeleccionBoton;
    private javax.swing.JButton empezarBoton;
    private javax.swing.JButton guardarBoton;
    private javax.swing.JMenuItem guardarComoMenuItem;
    private javax.swing.JButton guardarMatrizBoton;
    private javax.swing.JMenuItem guardarMenuItem;
    private javax.swing.JButton guardarSeleccionBoton;
    private javax.swing.JMenu herramientasMenu;
    private javax.swing.JPanel herramientasPanel;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JButton nuevoBoton1;
    private javax.swing.JMenuItem nuevoMenuItem;
    private javax.swing.JMenu opcionesMenu;
    private javax.swing.JPanel panelBotones;
    private javax.swing.JButton pressBoton;
    private javax.swing.JPanel principalPanel;
    private javax.swing.JTree problemaTree;
    private javax.swing.JMenuItem salirMenuItem;
    // End of variables declaration//GEN-END:variables

    private void inicializarNodos(Problema problema) {

        nodoProblema = new javax.swing.tree.DefaultMutableTreeNode(problema);
        nodoAlternativas = new javax.swing.tree.DefaultMutableTreeNode("Alternativas");
        nodoCriterios = new javax.swing.tree.DefaultMutableTreeNode("Criterios");

        nodoProblema.add(nodoAlternativas);
        nodoProblema.add(nodoCriterios);

        problemaTree.setModel(new javax.swing.tree.DefaultTreeModel(nodoProblema));
        problemaTree.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jScrollPane1.setViewportView(problemaTree);

        nodoInicializado = true;
    }

    public void cargarPanelDefecto() {
        panelDefecto.setBounds(new Rectangle(30, 30, 600, 350));

        principalPanel.add(panelDefecto, null);

        getContentPane().repaint();
        pack();
    }

    public void recargarAlternativa(Alternativa alternativa, int posicion) {
        javax.swing.tree.DefaultMutableTreeNode nodoNuevo = new javax.swing.tree.DefaultMutableTreeNode(alternativa);

        nodoAlternativas.insert(nodoNuevo, posicion);
        actualizarArbol();
        cargarAlternativaPanel(alternativa);

    }

    public void recargarCriterio(Criterio criterio, int posicion) throws IOException {
        javax.swing.tree.DefaultMutableTreeNode nodoNuevo = new javax.swing.tree.DefaultMutableTreeNode(criterio);

        nodoCriterios.insert(nodoNuevo, posicion);
        actualizarArbol();
        cargarCriterioPanel(criterio);

    }

    public void cargarAlternativaPanel(Alternativa alternativaACargar) {
        alternativaPanel = new AlternativaPanel();

        alternativaPanel.setBounds(new Rectangle(30, 30, 750, 350));
        principalPanel.remove(0);

        principalPanel.add(alternativaPanel, null);

        getContentPane().repaint();
        pack();

        alternativaPanel.crearDatosAlternativa(alternativaACargar);
        guardarMatrizBoton.setEnabled(false);
    }

    public void cargarCriterioPanel(Criterio criterioACargar) throws IOException {
        criterioPanel = new CriterioPanel();

        criterioPanel.setBounds(new Rectangle(30, 30, 750, 350));
        principalPanel.remove(0);

        principalPanel.add(criterioPanel, null);

        getContentPane().repaint();
        pack();

        criterioPanel.crearDatosCriterio(criterioACargar);
        guardarMatrizBoton.setEnabled(false);
    }

    public void habilitarBotonPress(boolean estado) {
        pressBoton.setEnabled(estado);
    }

    public void cargarMatrizInicialPanel() {

        matrizInicialPanel = new MatrizInicialPanel(this);
        matrizInicialPanel.setBounds(new Rectangle(5, 25, 980, 410));
        principalPanel.remove(0);

        principalPanel.add(matrizInicialPanel, null);

        getContentPane().repaint();
        pack();

        guardarMatrizBoton.setEnabled(true);

        ArrayList<Alternativa> alternativas = new ArrayList<Alternativa>();
        ArrayList<Criterio> criterios = new ArrayList<Criterio>();

        for (int i = 0; i < nodoAlternativas.getChildCount(); i++) {
            TreePath currentSelection = problemaTree.getPathForRow(i + 2);
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
            Alternativa alternativa = (Alternativa) currentNode.getUserObject();
            alternativas.add(alternativa);
        }

        for (int i = 0; i < nodoCriterios.getChildCount(); i++) {
            TreePath currentSelection = problemaTree.getPathForRow(i + 3 + nodoAlternativas.getChildCount());
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
            Criterio criterio = (Criterio) currentNode.getUserObject();
            criterios.add(criterio);
        }

        matrizInicialPanel.cargarTablaInicial(alternativas, criterios);

        if (matriz != null) {
            if (matriz.getMatriz() != null) {
//                matrizInicialPanel.setMatriz(matriz.getMatriz());
                matrizInicialPanel.cargarTablaGuardada(matriz.getMatriz());
            }
        }
    }

    public void actualizarArbol() {
        DefaultTreeModel model = (DefaultTreeModel) problemaTree.getModel();
        model.reload();
        problemaTree.expandRow(1);
        problemaTree.expandRow(2 + nodoAlternativas.getChildCount());

    }

    private void save(String[] xmlsAGuardar) {

        JFileChooser fileChooser = new JFileChooser();
        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("todos los archivos *.EDU", "edu", "EDU"));//filtro para ver solo archivos .edu
        int seleccion = fileChooser.showSaveDialog(null);
        try {
            if (seleccion == JFileChooser.APPROVE_OPTION) {//comprueba si ha presionado el boton de aceptar
                File JFC = fileChooser.getSelectedFile();
                String PATH = JFC.getAbsolutePath();//obtenemos el path del archivo a guardar
                PrintWriter printwriter = new PrintWriter(JFC);

                for (int i = 0; i < xmlsAGuardar.length; i++) {
                    printwriter.println(xmlsAGuardar[i]);//escribe en el archivo todos los xml
                }

                printwriter.close();//cierra el archivo

                //comprobamos si a la hora de guardar obtuvo la extension y si no se la asignamos
                if (!(PATH.endsWith(".edu"))) {
                    File temp = new File(PATH + ".edu");
                    JFC.renameTo(temp);//renombramos el archivo
                }

                JOptionPane.showMessageDialog(null, "Guardado exitoso!", "Guardado exitoso!", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (Exception e) {//por alguna excepcion salta un mensaje de error
            JOptionPane.showMessageDialog(null, "Error al guardar el archivo!", "Oops! Error", JOptionPane.ERROR_MESSAGE);
        }
    }
    String path = "";//creamos una variable global para guardar el path

    private String[] open() throws IOException {
        //empezamos implementando la clase JFileChooser para abrir archivos
        JFileChooser JFC = new JFileChooser();
        //filtro que muestra solo los archivos con extension *.edu
        JFC.setFileFilter(new FileNameExtensionFilter("todos los archivos *.EDU", "edu", "EDU"));
        //se comprueba si se ha dado al boton aceptar
        int abrir = JFC.showDialog(null, "Abrir");
        if (abrir == JFileChooser.APPROVE_OPTION) {
            FileReader FR = null;
            BufferedReader BR = null;

            try {
                //abro el fichero y creo un BufferedReader para hacer
                //una lectura comoda (tener el metodo readLine();)
                File archivo = JFC.getSelectedFile();//abre un archivo .lengf

                //evitar abrir archivo con otra extension que no sea *.LFP
                String PATH = JFC.getSelectedFile().getAbsolutePath();
                if (PATH.endsWith(".edu") || PATH.endsWith(".EDU")) {

                    FR = new FileReader(archivo);
                    BR = new BufferedReader(FR);

                    //leyendo el archivo
                    String linea;//variable para leer linea por linea el archivo de entrada
                    if (path.compareTo(archivo.getAbsolutePath()) == 0) {
                        JOptionPane.showMessageDialog(this, "Archivo Abierto o Dañado", "Oops! Error", JOptionPane.ERROR_MESSAGE);
                    } else {

                        String[] xmlsAAbrir = new String[CANTIDAD_ENTIDADES];

                        path = archivo.getAbsolutePath();
                        int contador = 0;
                        while ((linea = BR.readLine()) != null) { //cuando termina el texto del archivo?
                            xmlsAAbrir[contador] = linea;
                            linea = BR.readLine();
                            if (linea != null) {
                                xmlsAAbrir[contador] += linea;
                                linea = BR.readLine();
                            }
                            contador++;
                        }

                        return xmlsAAbrir;
                    }

                } else {
                    JOptionPane.showMessageDialog(this, "Archivo no soportado", "Oops! Error", JOptionPane.ERROR_MESSAGE);
                    open();
                }

            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
                //Logger.getLogger(fileChooser.class.getName()).log(Level.SEVERE, null, ex);
                //cerramos el fichero, para asegurar que se cierra tanto
                // si todo va bien si salta una excepcion
            } finally {
                try {
                    if (null != FR) {
                        FR.close();
                    }

                } catch (IOException ex) {
                    ex.printStackTrace();
                    //Logger.getLogger(fileChooser.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return new String[0];
    }

    private void añadirAlternativa() {

        if (nodoInicializado) {
            Alternativa alternativaNueva = controladorAlternativas.crearAlternativa(nodoAlternativas.getChildCount());
            recargarAlternativa(alternativaNueva, nodoAlternativas.getChildCount());
            alternativaSeleccionada = nodoAlternativas.getChildCount() - 1;
            int seleccionEnElArbol = nodoAlternativas.getChildCount() + 1;
            problemaTree.setSelectionInterval(seleccionEnElArbol, seleccionEnElArbol);
            panelSeleccionado = PANEL_ALTERNATIVA;
        } else {
            JOptionPane.showMessageDialog(this, "Debe crear un nuevo problema antes de crear alternativas", "Oops! Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void añadirCriterio() throws IOException {

        if (nodoInicializado) {
            Criterio criterioNuevo = controladorCriterios.crearCriterio(nodoCriterios.getChildCount());
            recargarCriterio(criterioNuevo, nodoCriterios.getChildCount());
            criterioSeleccionado = nodoCriterios.getChildCount() - 1;
            int seleccionEnElArbol = nodoAlternativas.getChildCount() + nodoCriterios.getChildCount() + 2;
            problemaTree.setSelectionInterval(seleccionEnElArbol, seleccionEnElArbol);
            panelSeleccionado = PANEL_CRITERIO;
        } else {
            JOptionPane.showMessageDialog(this, "Debe crear un nuevo problema antes de crear criterios", "Oops! Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void nuevoProblema() {
        String nombreProblema = JOptionPane.showInputDialog("Ingrese el nombre del problema por favor:");

        if (nombreProblema != null) {
            if (nombreProblema.equals("")) {
                JOptionPane.showMessageDialog(this, "Archivo no soportado", "Oops! Error", JOptionPane.ERROR_MESSAGE);
            } else {
                Problema problema = new Problema();
                problema.setNombre(nombreProblema);
                inicializarNodos(problema);
            }
        }
    }

    private void abrirArchivo() {
        try {

            if (nodoInicializado) {
                nodoAlternativas.removeAllChildren();
                nodoCriterios.removeAllChildren();
            }

            String[] xmls = open();

            if (xmls.length > 0) {

                if (xmls[0] != null && !xmls[0].equals("")) {
                    ArrayList<Problema> problemas = (ArrayList<Problema>) ProblemaHelper.getInstancias(xmls[0]);
                    inicializarNodos(problemas.get(0));
                }
                if (xmls[1] != null && !xmls[1].equals("")) {
                    ArrayList<Alternativa> alternativas;
                    alternativas = (ArrayList<Alternativa>) AlternativaHelper.getInstancias(xmls[1]);
                    int contador = 0;
                    for (Alternativa alternativa : alternativas) {
                        recargarAlternativa(alternativa, contador);
                        contador++;
                    }
                }
                if (xmls[2] != null && !xmls[2].equals("")) {
                    ArrayList<Criterio> criterios;
                    criterios = (ArrayList<Criterio>) CriterioHelper.getInstancias(xmls[2]);
                    int contador = 0;
                    for (Criterio criterio : criterios) {
                        recargarCriterio(criterio, contador);
                        contador++;
                    }
                }
                if (xmls[3] != null && !xmls[3].equals("")) {
                    ArrayList<Matriz> matrices;
                    matrices = (ArrayList<Matriz>) MatrizHelper.getInstancias(xmls[3]);

                    cargarMatrizInicialPanel();
                    matrizInicialPanel.setMatriz(matrices.get(0).getMatriz());

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void guardarArchivo() {
        if (nodoInicializado) {
            ArrayList<Alternativa> alternativas = new ArrayList<Alternativa>();
            ArrayList<Criterio> criterios = new ArrayList<Criterio>();
            ArrayList<Problema> problemas = new ArrayList<Problema>();
            ArrayList<Matriz> matrices = new ArrayList<Matriz>();

            TreePath currentSelection = problemaTree.getPathForRow(0);
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
            Problema problema = (Problema) currentNode.getUserObject();
            problemas.add(problema);

            String[] xmls = new String[CANTIDAD_ENTIDADES];
            xmls[0] = ProblemaHelper.getDocumento(problemas);

            for (int i = 0; i < nodoAlternativas.getChildCount(); i++) {
                currentSelection = problemaTree.getPathForRow(i + 2);
                currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
                Alternativa alternativa = (Alternativa) currentNode.getUserObject();
                alternativas.add(alternativa);
            }

            xmls[1] = AlternativaHelper.getDocumento(alternativas);

            for (int i = 0; i < nodoCriterios.getChildCount(); i++) {
                currentSelection = problemaTree.getPathForRow(i + 3 + nodoAlternativas.getChildCount());
                currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
                Criterio criterio = (Criterio) currentNode.getUserObject();
                criterios.add(criterio);
            }
            xmls[2] = CriterioHelper.getDocumento(criterios);

            if (matriz != null) {
                if (matriz.getMatriz() != null) {
                    matrices.add(matriz);
                    xmls[3] = MatrizHelper.getDocumento(matrices);

                }
            }
            save(xmls);
        } else {
            JOptionPane.showMessageDialog(this, "No existen datos para guardar", "Oops! Error", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    private void AbrirInforme(String directorio) {
        directorio = Calculos.RUTA_INFORMES + directorio;
        File archivo = new File(directorio);
        try {
            Desktop.getDesktop().open(archivo);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
